/*@filename: Employee.java
 *Created on 2007年11月18日, 下午3:43
 *@author: kldscs 
 *@note: 
 *  业务员对客户的添加、修改、删除和查询功能
 *  以及修改业务员自己的密码、查询所有业务信息实现
 *@version: 
 *2007-11-24  0.5   优化了函数内容 和 返回出错信息，
 *                  解决了Close函数，不能提前关闭的问题;
 *2007-11-24  0.4   添加了查询业务函数Search_Buss()，
 *                  返回业务编号，中文名，当前信息;
 *2007-11-20  0.3   根据和qianchangqac92讨论的意见，
 *                  把返回的结果搜索集修改为返回数组;
 *2007-11-19  0.2   修改了判断用户身份证唯一的问题;
 *            0.1   完成基本构架;
 */

package users; //人员功能包
import mysql.J2MySQL;  //载入J2MySQL底层类库  
import java.sql.*; 

public class Employee 
/*业务员功能类
 *包括对用户表的添加、修改、查询、删除
 *对自己密码的修改
 *返回值 1.登录成功   2.数据库连接失败   
 *      3.用户不存在  4.用户密码错误
 */
{  
    public int ID=0 ; //用户ID
    public Employee() {
    }   //构造函数为空
    public J2MySQL mydb = new J2MySQL();  // 创建数据库操作对象
    
    public int Connect(String server, String port, String passwd, 
            int id, String pass )
    /*
    功   能：
        连接数据库和业务员登录系统
    参数说明：
        server  服务器地址
        port    端口
        passwd  MySQL用户(employee)密码
        id      业务员ID
        pass    业务员密码
     返回结果：
        1       登录成功
        2       MySQL连接失败
        3       用户id不存在
        4       密码错误
     */
    {   ResultSet rs=null;   
        if (false == mydb.Connect(server,port,"Bank","employee",passwd))
                return 2;  // 连接数据库不成功
        try{
            rs=mydb.Select("select * from Administrators " +
                "where ID='"+id+"' and power=1");
            if (!rs.next())
                return 3; //用户不存在
            
            rs=mydb.Select("select * from Administrators "+
                   "where ID=\""+id+"\" and power=1 and " +
                    "Passwd=MD5("+pass+")");
            if (!rs.next())
                return 4; //用户密码错误
        }
         catch (Exception Ex)   //输出错误
         {   System.err.println("Error: Employee Connect.\n"+Ex.getMessage());
             Ex.printStackTrace();  //输出错误
         } // 用户及密码判断 DONE
         
         ID=id; //传入ID
         return 1; //登录成功
    } //Connect DONE
    /////////////////////////////////////////////////////////
    
    public int Insert(String Name,String ID_Card,
            String Tel,String Num_Buss)
    /*
    功   能：
        插入客户信息
    参数说明：
        Name        客户姓名
        ID_Card     身份证
        Tel         电话
        Num_Buss    已开通业务
     返回结果：
        1       插入成功 
        2       用户未登录
        3       用户已存在,身份证不能重复
        4       数据操作失败
     */
    {
        if(ID == 0)
            return 2; //没有登录
        if(Select(3,ID_Card).length != 0)
            return 3;  //用户已存在
        String  sqlString="INSERT INTO Users (Name, ID_Card, Tel, Num_Buss)" +
                " VALUES (\""+Name+"\",\""+ID_Card+"\",\""+Tel+"\",\""
                +Num_Buss+"\")";
        if(1 == mydb.Insert(sqlString))  //调用插入函数
            return 1; //成功
        else 
            return 4; //失败
     }  // Insert DONE
    
    public int Delete(int id)
    /*
    功    能:
        删除客户
    参数说明:
       id   客户ID
    返回结果:
        1   删除成功
        2   业务员未登录
        3   客户id不存在
        4   数据库操作出错 
     */
    {
        if(ID == 0)
            return 2; //没有登录
        if(Select(1,String.valueOf(id)).length == 0)
            return 3;  //用户不存在
        String sqlString="DELETE FROM Users WHERE ID="+id;
        if(1 == mydb.Delete(sqlString))  //调用删除函数
            return 1; //成功
        else 
            return 4; //失败        
    } //Delete DONE
    
    public int Update(int id, String Num_Buss)
    /*
    功    能:
        修改客户业务
    参数说明:
        id          客户编号ID
        Num_Buss    修改后的已开通业务    
    返回结果:     
        1       修改成功
        2       业务员没登录
        3       客户不存在
        4       数据操作出错
     */
    {
        if(ID == 0)
            return 2; //没有登录
        if(Select(1,String.valueOf(id)).length == 0)
            return 3;  //用户不存在
        String sqlString="UPDATE Users SET Num_Buss=\""
                +Num_Buss+"\" where ID="+id;
        if(1 == mydb.Update(sqlString))  //调用删除函数
            return 1; //成功
        else 
            return 4; //失败        
    } //Update DONE
    
    public String[][] Select(int flag, String message)
    /*
    功    能:
        查询客户信息
    参数说明:
        flag为标志，
            1为按ID查找， 2为按姓名查找， 3为按身份证查找
        message     需查找的信息
     返回结果: 
        返回二维数组，分别是
            result[i][0]     ID,用户编号
            result[i][1]     Name,用户姓名
            result[i][2]     ID_Card,身份证号
            result[i][3]     Tel,电话
            result[i][4]     Num_Buss,已注册业务
     */
    {
        ResultSet rs=null;  //搜索结果集 
       
        if(ID == 0)
            return null; //没有登录
        String sqlString = null, sqlString2=null; 
        if(flag==1)   //按ID查询
            sqlString=" WHERE ID="+message;
        else if(flag==2)    //按姓名查询
            sqlString=" WHERE Name=\""+message+"\"";
        else if(flag==3)    //按身份证查询
            sqlString=" WHERE ID_Card=\""+message+"\"";
        else 
            return null;
        // 得出结果两个select语句
        sqlString2="SELECT COUNT(*) AS NUM FROM Users "+sqlString;
        sqlString="SELECT * FROM Users "+sqlString;
        
        try
        {   rs=mydb.Select(sqlString2);  //得到结果集个数
            int k=0;
            if(rs.next())  //得到数组的行数
                k=rs.getInt("NUM");
            else  //出错
            {   System.out.println("Error: Employee COUNT.");
                return null;
            }          
            
            String[][] result=new String[k][5]; //建立结果集数组
            rs=mydb.Select(sqlString);  //得到结果集
            for(int i=0; rs.next(); i++) //循环得到结果数组
            {  // System.out.println(rs.getString("Name"));
                result[i][0]=rs.getString("ID");   //用户编号
                result[i][1]=rs.getString("Name");   //用户姓名
                result[i][2]=rs.getString("ID_Card");   //身份证号
                result[i][3]=rs.getString("Tel");  //电话
                result[i][4]=rs.getString("Num_Buss");   //已注册业务           
            }
            return result; //返回结果集
        }
        catch (Exception Ex)   //输出错误
        {   System.err.println("Error: Employee SELECT.\n"
                    +Ex.getMessage());
            Ex.printStackTrace();  //输出错误
            return null; //结果   
        } //结果集数组 DONE                   
    } //Select DONE
    //////////////////////////////////////////////////
    
    public String[] Search()
    /*
    功    能:
        查询业务员自身的信息
    参数说明:
        无，函数会根据登录时给出的ID查询
    返回结果:
        返回一维数组，分别是
            result[0]  ID,银行工作人员编号
            result[1]  Name,工作人员姓名  
            result[2]  ID_Card,身份证  
            result[3]  Tel,电话
            result[4]  Address,地址  
            result[5]  Power,权限 1为业务员 7为经理
            result[6]  Time_Last,上次改密时间      
     */
    {
        ResultSet rs=null;  //结果集
          
       if(ID == 0)
           return null; //没有登录
        String sqlString="SELECT * FROM Administrators " +
                    "WHERE ID="+ID;
        rs=mydb.Select(sqlString); //得到结果集 
        String[] result=new String[7];
        try
        {
            if(rs.next())
            {
                result[0]=rs.getString("ID");    //银行工作人员编号
                result[1]=rs.getString("Name");   //工作人员姓名  
                result[2]=rs.getString("ID_Card");  //身份证  
                result[3]=rs.getString("Tel");    //电话
                result[4]=rs.getString("Address");  //地址  
                result[5]=rs.getString("Power");   //权限 1为业务员 7为经理
                result[6]=rs.getString("Time_Last");  //上次改密时间      
            }
            else
            {   System.out.println("Error: Employee Serch NULL.");
                return null;
            }
            return result;  //返回结果数组
        }
        catch(Exception Ex)   //输出错误
        {   System.err.println("Error: Employee Search.\n"
                    +Ex.getMessage());
            Ex.printStackTrace();  //输出错误
            return null; //结果   
        }
    }  // Rearch DONE
     
    public int Alter(String new_pwd, String new_pwd2,
            String old_pwd)
    /*
    功    能:
        修改业务员自己的密码
   参数说明:
        new_pwd     第一次输入的新密码
        new_pwd2    第二次输入的新密码
        old_pwd     输入的业务员旧密码
    返回结果:
        本函数判断并反回错误编号：
        1       修改成功 
        2       用户没有登录
        3       密码必须同时包括字母、数字以及其他字符
        4       数据库操作出错
        5       每次修改的密码不能与前三次密码相同
        6       旧密码错误
        7       2次输入新密码不一致
        8       不能含有工号
        9       用户密码的长度最少8位，最多16位  
     */
    {
        if(ID == 0)
           return 2; //没有登录
        ResultSet rs=null; //初始化结果集
        String sqlString=null;
        if(!new_pwd.equals(new_pwd2))
            return 7; //2次输入新密码不一致
        try  //判断旧密码
        {   sqlString="SELECT IF( MD5("+old_pwd+")=" +
                    " Passwd,1,0) AS one from Administrators" +
                    " where id="+ID;
            rs=mydb.Select(sqlString);
            rs.first();
            if (0 == rs.getInt("one"))
                return 6; //旧密码出错
         }
         catch (Exception Ex)   //输出错误
         {   System.err.println("Error: OLD_PASSWORD.\n"+Ex.getMessage());
             Ex.printStackTrace();  //输出错误
         } // 旧密码 DONE
         
        if(new_pwd.length()<8 || new_pwd.length()>16)
            return 9; //新密码长度有问题
        
        boolean Dflag,Lflag,Cflag; //定义数字、字母、字符 标识
        Dflag=Lflag=Cflag=false;
        for(int i=0; i<new_pwd.length(); i++)
            if(Character.isDigit(new_pwd.charAt(i)))
                Dflag=true; //数字
            else if(Character.isLetter(new_pwd.charAt(i)))
                Lflag=true; //字母
            else
                Cflag=true;
        if(!Dflag || !Lflag || !Cflag)
            return 3 ; //不符合既有字母、字符、数字
        
        if(new_pwd.indexOf(String.valueOf(ID)) != -1)
            return 8; //包含工号 
        
        
         try  //修改的密码不能与前三次密码相同
        {   sqlString="SELECT IF(\""+new_pwd+"\"=Passwd_Old1" +
                " or \""+new_pwd+"\"=Passwd_Old2 ,1,0) AS one " +
                "from Administrators where ID="+ID;
            rs=mydb.Select(sqlString);
            rs.next();
            if (1 == rs.getInt("one"))
                return 5; //修改的密码不能与前三次密码相同
         }
         catch (Exception Ex)   //输出错误
         {   System.err.println("Error: 3 PASSWORD.\n"+Ex.getMessage());
             Ex.printStackTrace();  //输出错误
             return 4;
         } // 修改的密码不能与前三次密码相同  DONE
        
        //修改密码
        sqlString="UPDATE Administrators SET " +
                "Passwd_Old2=Passwd_Old1," +
                "Passwd_Old1=\""+old_pwd+"\"," +
                "Passwd=MD5(\""+new_pwd+"\")," +
                "Time_Last=NOW() WHERE ID="+ID; 
        if (1 == mydb.Update(sqlString))
            return 1; //改密成功
        else
            return 4; //未知错误
    } // Alter DONE
    
    public String[][] Search_Buss()
    /*
    功    能:
        搜索所有业务编号 和 对应的中文注释
    参数说明:
        无
    返回结果:
        返回一个多维数祖
        result[i][0]  业务编号
        result[i][1]  中文名  
        result[i][2]  业务当前信息
    */
    {
        // 得出结果两个select语句
        String sqlString=null, sqlString2=null;
        ResultSet rs=null; //初始化结果集
        
        sqlString2="SELECT COUNT(*) AS NUM FROM Business ";
        sqlString="SELECT Num_Bus,Name_CN,Content FROM Business ";
        
        try
        {   rs=mydb.Select(sqlString2);  //得到结果集个数
            int k=0;
            if(rs.next())  //得到数组的行数
               k=rs.getInt("NUM");
            else  //出错
            {   System.out.println("Error: Employee Business COUNT.");
                return null;
            }          
            
            String[][] result=new String[k][3]; //建立结果集数组
            rs=mydb.Select(sqlString);  //得到结果集
            for(int i=0; rs.next(); i++) //循环得到结果数组
            {  
                result[i][0]=rs.getString("Num_Bus");   //业务编号
                result[i][1]=rs.getString("Name_CN");   //业务中文名 
                result[i][2]=rs.getString("Content");   //业务当前信息
            }
            return result; //返回结果集
        }
        catch (Exception Ex)   //输出错误
        {   System.err.println("Error: Employee Business Search.\n"
                    +Ex.getMessage());
            Ex.printStackTrace();  //输出错误
            return null; //结果   
        } //结果集数组 DONE   
    }  // Search_Buss DONE
    
    public void CloseEmployee()
    /*
    功    能:
        关闭业务员对象
    参数说明:
        无
    返回结果:
        无
    */
    {   
        if(ID!=0)
        {
            ID=0;
            mydb.Closedb();
        }
    }  // CloseEmployee DONE
}
